package com.example.springbootmqdemo.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

//@Configuration
//可靠消费 生产者config
public class ACKRabbitMqConfiguration {

    //1.声明一个fanout类型的交换机 FanoutExchange 为fanout类型  DirectExchange为direct类型
    @Bean
    public FanoutExchange ACKFanoutExchange() {
        //  return new DirectExchange("TestDirectExchange",true,true);
        return new FanoutExchange("ACK_fanout_exchange", true, false);
    }


    //2. Queue 过期时间
    @Bean
    public Queue ackQueue() {
        Map<String,Object> args = new HashMap<>();
        //1.消费者使用basic.reject或 basic.nack声明消费失败，并且消息的requeue参数设置为false
        //2.消息是一个过期消息，超时无人消费
        //3.要投递的队列消息堆积满了，最早的消息可能成为死信
        //如果该队列配置了dead-letter-exchange属性，指定了一个交换机，那么队列中的死信就会投递到这个交换机(dead_direct_exchange)中，而这个交换机称为死信交换机(Dead Letter Exchange，简称DLX）。
        args.put("x-dead-letter-exchange","dead_direct_exchange"); // 消息转发到 dead_direct_exchange交换机
        return new Queue("orderAck.queue", true,false,false,args);
    }

    //3 绑定  将队列和交换机绑定
    @Bean
    //3.1  将队列orderAck.queue
    // 绑定到 名为 “ACK_fanout_exchange”的fanout类型的交换机上
    public Binding ackBinding() {
        return BindingBuilder.bind(ackQueue()).to(ACKFanoutExchange());
    }

}
